/*
 *  Copyright 2006 The Apache Software Foundation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package org.mybatis.generator.internal.rules;

import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;

/**
 * This interface centralizes all the rules related to code generation - including the methods and objects to create, and certain attributes related to those objects.
 * 
 * @author Jeff Butler
 */
public interface Rules
{
    /**
     * Implements the rule for generating the insert SQL Map element and DAO method. If the insert statement is allowed, then generate the element and method.
     * 
     * @return true if the element and method should be generated
     */
    boolean generateInsert();
    
    /**
     * Implements the rule for generating the insert selective SQL Map element and DAO method. If the insert statement is allowed, then generate the element and method.
     * 
     * @return true if the element and method should be generated
     */
    boolean generateInsertSelective();
    
    /**
     * Calculates the class that contains all fields. This class is used as the insert statement parameter, as well as the returned value from the select by primary key method. The actual class
     * depends on how the domain model is generated.
     * 
     * @return the type of the class that holds all fields
     */
    FullyQualifiedJavaType calculateAllFieldsClass();
    
    /**
     * Implements the rule for generating the update by primary key without BLOBs SQL Map element and DAO method. If the table has a primary key as well as other non-BLOB fields, and the
     * updateByPrimaryKey statement is allowed, then generate the element and method.
     * 
     * @return true if the element and method should be generated
     */
    boolean generateUpdateByPrimaryKeyWithoutBLOBs();
    
    /**
     * Implements the rule for generating the update by primary key with BLOBs SQL Map element and DAO method. If the table has a primary key as well as other BLOB fields, and the updateByPrimaryKey
     * statement is allowed, then generate the element and method.
     * 
     * @return true if the element and method should be generated
     */
    boolean generateUpdateByPrimaryKeyWithBLOBs();
    
    /**
     * Implements the rule for generating the update by primary key selective SQL Map element and DAO method. If the table has a primary key as well as other fields, and the updateByPrimaryKey
     * statement is allowed, then generate the element and method.
     * 
     * @return true if the element and method should be generated
     */
    boolean generateUpdateByPrimaryKeySelective();
    
    /**
     * Implements the rule for generating the delete by primary key SQL Map element and DAO method. If the table has a primary key, and the deleteByPrimaryKey statement is allowed, then generate the
     * element and method.
     * 
     * @return true if the element and method should be generated
     */
    boolean generateDeleteByPrimaryKey();
    
    /**
     * Implements the rule for generating the delete by example SQL Map element and DAO method. If the deleteByExample statement is allowed, then generate the element and method.
     * 
     * @return true if the element and method should be generated
     */
    boolean generateDeleteByExample();
    
    /**
     * Implements the rule for generating the result map without BLOBs. If either select method is allowed, then generate the result map.
     * 
     * @return true if the result map should be generated
     */
    boolean generateBaseResultMap();
    
    /**
     * Implements the rule for generating the result map with BLOBs. If the table has BLOB columns, and either select method is allowed, then generate the result map.
     * 
     * @return true if the result map should be generated
     */
    boolean generateResultMapWithBLOBs();
    
    /**
     * Implements the rule for generating the SQL example where clause element.
     * 
     * In iBATIS2, generate the element if the selectByExample, deleteByExample, updateByExample, or countByExample statements are allowed.
     * 
     * In MyBatis3, generate the element if the selectByExample, deleteByExample, or countByExample statements are allowed.
     * 
     * @return true if the SQL where clause element should be generated
     */
    boolean generateSQLExampleWhereClause();
    
    /**
     * Implements the rule for generating the SQL example where clause element specifically for use in the update by example methods.
     * 
     * In iBATIS2, do not generate the element.
     * 
     * In MyBatis, generate the element if the updateByExample statements are allowed.
     * 
     * @return true if the SQL where clause element should be generated
     */
    boolean generateMyBatis3UpdateByExampleWhereClause();
    
    /**
     * Implements the rule for generating the SQL base column list element. Generate the element if any of the select methods are enabled.
     * 
     * @return true if the SQL base column list element should be generated
     */
    boolean generateBaseColumnList();
    
    /**
     * Implements the rule for generating the SQL blob column list element. Generate the element if any of the select methods are enabled, and the table contains BLOB columns.
     * 
     * @return true if the SQL blob column list element should be generated
     */
    boolean generateBlobColumnList();
    
    /**
     * Implements the rule for generating the select by primary key SQL Map element and DAO method. If the table has a primary key as well as other fields, and the selectByPrimaryKey statement is
     * allowed, then generate the element and method.
     * 
     * @return true if the element and method should be generated
     */
    boolean generateSelectByPrimaryKey();
    
    /**
     * Implements the rule for generating the select by example without BLOBs SQL Map element and DAO method. If the selectByExample statement is allowed, then generate the element and method.
     * 
     * @return true if the element and method should be generated
     */
    boolean generateSelectByExampleWithoutBLOBs();
    
    /**
     * Implements the rule for generating the select by example with BLOBs SQL Map element and DAO method. If the table has BLOB fields and the selectByExample statement is allowed, then generate the
     * element and method.
     * 
     * @return true if the element and method should be generated
     */
    boolean generateSelectByExampleWithBLOBs();
    
    /**
     * Implements the rule for generating an example class. The class should be generated if the selectByExample or deleteByExample or countByExample methods are allowed.
     * 
     * @return true if the example class should be generated
     */
    boolean generateExampleClass();
    
    boolean generateCountByExample();
    
    boolean generateUpdateByExampleSelective();
    
    boolean generateUpdateByExampleWithoutBLOBs();
    
    boolean generateUpdateByExampleWithBLOBs();
    
    /**
     * Implements the rule for determining whether to generate a primary key class. If you return false from this method, and the table has primary key columns, then the primary key columns will be
     * added to the base class.
     * 
     * @return true if a separate primary key class should be generated
     */
    boolean generatePrimaryKeyClass();
    
    /**
     * Implements the rule for generating a base record.
     * 
     * @return true if the class should be generated
     */
    boolean generateBaseRecordClass();
    
    /**
     * Implements the rule for generating a record with BLOBs. If you return false from this method, and the table had BLOB columns, then the BLOB columns will be added to the base class.
     * 
     * @return true if the record with BLOBs class should be generated
     */
    boolean generateRecordWithBLOBsClass();
    
    /**
     * Implements the rule for generating a Java client. This rule is only active when a javaClientGenerator configuration has been specified, but the table is designated as "modelOnly". Do not
     * generate the client if the table is designated as modelOnly.
     * 
     * @return true if the Java client should be generated
     */
    boolean generateJavaClient();
    
    IntrospectedTable getIntrospectedTable();
}
